package com.ml.rabbitmq.b_work.fair;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.TimeoutException;

/**
 * @author xr-8
 * @create 2021-04-14 22:56
 */
public class Producer {

    public static void main(String[] args) {
        //1创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
//        connectionFactory.setVirtualHost("/ ");
        Connection connection = null;
        Channel channel = null;
        try {
            //2创建连接Connection
            connection = connectionFactory.newConnection("生产者");
            //3通过连接获取通道Channel
            channel = connection.createChannel();
            //4通过通道创建交换机，声明队列，绑定关系，路由Key,发送消息，和接收消息
            String queueName = "queue1";
            /**
             * param1 队列名称
             * param2 是否要持久化，durable = false 所谓持久化消息是否存盘，如果false非持久化，true持久化？非持久化会存盘吗？会，但是会随着服务器重启而丢失
             * param3 排他性，是否是独占独立，如果为true,会对当前队列加锁，其他的通道不能访问，并且连接自动关闭。
             * param4 是否自动删除，随着最后一个消费者断开连接（消费完毕消息）以后是否把自动删除消息
             * param5 携带附属参数，设置队列的有效期，消息的最大长度，队列的消息生命周期等
             */
            channel.queueDeclare(queueName, true, false, false, null);
            for (int i = 0; i < 20; i++) {
                //5准备消息内容
                String message = "Hello Study work"+i;
                //6发送消息给队列queue
                channel.basicPublish("", queueName, null, message.getBytes());
            }

            System.out.println("消息发送成功！");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //7关闭通道
            if (Objects.nonNull(channel) && channel.isOpen()) {
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
            //8关闭连接
            if (Objects.nonNull(connection) && connection.isOpen()) {
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}
